package co.edu.uniquindio.proyecto.entidades;

import java.io.Serializable;
import java.lang.Integer;
import java.util.Date;
import java.util.List;

import javax.persistence.*;

/**
 * Entity implementation class for Entity: Correo
 * Clase que representa la entidad Correo
 *
 * @author Johan Sebastian Giraldo Hurtado
 * @author Universidad del Quindio
 * @version 1.0
 * @since 17/03/2014
 *
 */
@Entity
public class Correo implements Serializable {

	/**
	 * Atributo que contiene el valor de serialVersionUID dentro de la clase
	 */
	private static final long serialVersionUID = 1L;
	
	/**
	 * Atributo que contiene el valor de Id dentro de la clase
	 */
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer Id;
	
	/**
	 * Atributo que contiene el valor de etiqueta dentro de la clase
	 */
	private String etiqueta;
	
	/**
	 * Atributo que contiene el valor de asunto dentro de la clase
	 */
	private String asunto;
	
	/**
	 * Atributo que contiene el valor de remitente dentro de la clase
	 */
	private Persona remitente;
	
	/**
	 * Atributo que contiene el valor de destinatario dentro de la clase
	 */
	private Persona destinatario;
	
	/**
	 * Atributo que contiene el valor de fechaEnvio dentro de la clase
	 */
	@Temporal(TemporalType.DATE)
	private Date fechaEnvio;
	
	/**
	 * Atributo que contiene el valor de adjuntos dentro de la clase
	 */
	@OneToMany(mappedBy = "correo")
	private List<Adjunto> adjuntos;
	
	/**
	 * Atributo que contiene el valor de clientes dentro de la clase
	 */
	@ManyToMany
	private List<Cliente> clientes;
	
	/**
	 * Atributo que contiene el valor de empleados dentro de la clase
	 */
	@ManyToMany
	private List<Empleado> empleados;
	
	/**
	 * Este metodo permite obtener el valor del atributo empleados
	 * @return Retorna el valor del atributo empleados
	 */
	public List<Empleado> getEmpleados() {
		return empleados;
	}

	/**
	 * Este metodo permite asignar un valor al atributo empleados
	 * @param empleados El valor a ser asginado al atributo empleados
	 */
	public void setEmpleados(List<Empleado> empleados) {
		this.empleados = empleados;
	}

	/**
	 * Este metodo permite obtener el valor del atributo clientes
	 * @return Retorna el valor del atributo clientes
	 */
	public List<Cliente> getClientes() {
		return clientes;
	}

	/**
	 * Este metodo permite asignar un valor al atributo clientes
	 * @param clientes El valor a ser asginado al atributo clientes
	 */
	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}

	/**
	 * Este metodo permite obtener el valor del atributo adjuntos
	 * @return Retorna el valor del atributo adjuntos
	 */
	public List<Adjunto> getAdjuntos() {
		return adjuntos;
	}
	
	/**
	 * Este metodo permite asignar un valor al atributo adjuntos
	 * @param adjuntos El valor a ser asginado al atributo adjuntos
	 */
	public void setAdjuntos(List<Adjunto> adjuntos) {
		this.adjuntos = adjuntos;
	}

	/**
	 * Este metodo permite obtener el valor del atributo id
	 * @return Retorna el valor del atributo id
	 */
	public Integer getId() {
		return Id;
	}

	/**
	 * Este metodo permite asignar un valor al atributo id
	 * @param id El valor a ser asginado al atributo id
	 */
	public void setId(Integer id) {
		Id = id;
	}

	/**
	 * Este metodo permite obtener el valor del atributo etiqueta
	 * @return Retorna el valor del atributo etiqueta
	 */
	public String getEtiqueta() {
		return etiqueta;
	}

	/**
	 * Este metodo permite asignar un valor al atributo etiqueta
	 * @param etiqueta El valor a ser asginado al atributo etiqueta
	 */
	public void setEtiqueta(String etiqueta) {
		this.etiqueta = etiqueta;
	}

	/**
	 * Este metodo permite obtener el valor del atributo asunto
	 * @return Retorna el valor del atributo asunto
	 */
	public String getAsunto() {
		return asunto;
	}

	/**
	 * Este metodo permite asignar un valor al atributo asunto
	 * @param asunto El valor a ser asginado al atributo asunto
	 */
	public void setAsunto(String asunto) {
		this.asunto = asunto;
	}

	/**
	 * Este metodo permite obtener el valor del atributo remitente
	 * @return Retorna el valor del atributo remitente
	 */
	public Persona getRemitente() {
		return remitente;
	}

	/**
	 * Este metodo permite asignar un valor al atributo remitente
	 * @param remitente El valor a ser asginado al atributo remitente
	 */
	public void setRemitente(Persona remitente) {
		this.remitente = remitente;
	}

	/**
	 * Este metodo permite obtener el valor del atributo destinatario
	 * @return Retorna el valor del atributo destinatario
	 */
	public Persona getDestinatario() {
		return destinatario;
	}

	/**
	 * Este metodo permite asignar un valor al atributo destinatario
	 * @param destinatario El valor a ser asginado al atributo destinatario
	 */
	public void setDestinatario(Persona destinatario) {
		this.destinatario = destinatario;
	}

	/**
	 * Este metodo permite obtener el valor del atributo fechaEnvio
	 * @return Retorna el valor del atributo fechaEnvio
	 */
	public Date getFechaEnvio() {
		return fechaEnvio;
	}

	/**
	 * Este metodo permite asignar un valor al atributo fechaEnvio
	 * @param fechaEnvio El valor a ser asginado al atributo fechaEnvio
	 */
	public void setFechaEnvio(Date fechaEnvio) {
		this.fechaEnvio = fechaEnvio;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((Id == null) ? 0 : Id.hashCode());
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Correo other = (Correo) obj;
		if (Id == null) {
			if (other.Id != null)
				return false;
		} else if (!Id.equals(other.Id))
			return false;
		return true;
	}

}
